查看原文
其他

深度解析丨你不知道的eBPF-Android系统监测方案

路人甲 vivo千镜 2022-11-05



一、前言

传统的Android动态监测工具,例如frida/ strace,都运行在用户空间。由于现在越来越多的应用程序都采用了反调试技术, 这也导致frida/strace在逆向的时候往往无法正常工作。

因此,有些人一直在编写内核模块来实现调试工具,以避免用户空间检测。但是,目标应用程序仍然可以利用对应的手段找到加载的内核模块。

相比之下,eBPF 程序具有与内核模块相同的访问级别,同时,编写和维护起来要容易得多,这也使得eBPF在Android 动态检测方面发挥越来越大的作用。



二、具体功能点

本次 eBPF Android 环境是基于cuttlefishcustom kerneladebbcc 的组合,具体功能点如下:

  • adeb: 在cuttlefish设备上安装adeb

  • kernel: 使用所需的内核配置构建自定义内核

  • cuttlefish: 在 KVM 上构建和设置cuttlefish设备

  • bcc: 使用 adb 在设备的 Debian 环境中构建和安装 bcc。




三、操作步骤

3.1选择内核功能

eBPF 和 bcc 依赖于许多内核中没有的功能,因此必须提前选择自己所需的内核功能用例,这点至关重要。

具体可以参考以下收集的配置信息,这些标志以Android配置文件的格式编写,因此可以直接将其复制并粘贴到构建配置文件中。

-d表示删除标志,-e表示添加标志。

特征

标志

Default gki_kprobe configs in common-kernel

- Disable kernel security features
  - Add debugging support
  - Reduce kernel build time

-d CONFIG_LTO \

-d CONFIG_LTO_CLANG \

-d CONFIG_CFI_CLANG \

-d CFI_PERMISSIVE \

-d CFI_CLANG \

-e CONFIG_IRQSOFF_TRACER \

-e CONFIG_PREEMPT_TRACER \

-e CONFIG_DEBUG_FS \

-e CONFIG_CHECKPOINT_RESTORE \

-d CONFIG_RANDOMIZE_BASE \

Enable eBPF support

-e CONFIG_BPF \

-e CONFIG_BPF_SYSCALL \

-e CONFIG_BPF_JIT \

-e CONFIG_HAVE_EBPF_JIT \

-e CONFIG_IKHEADERS \

Enable kprobe

-e CONFIG_HAVE_KPROBES \

-e CONFIG_KPROBES \

-e CONFIG_KPROBE_EVENT \

Enable kretprobe

-e CONFIG_KRETPROBES \

-e CONFIG_HAVE_KRETPROBES \

-d CONFIG_SHADOW_CALL_STACK \

-e CONFIG_ROP_PROTECTION_NONE\

Enable uprobe

-e CONFIG_UPROBES \

-e CONFIG_UPROBE_EVENT \

-e CONFIG_BPF_EVENTS \

[BCC tool] tc filters and tc   actions

-e CONFIG_NET_CLS_BPF \

-e CONFIG_NET_ACT_BPF \

[BCC tool] bcc networking examples

-e CONFIG_NET_SCH_SFQ \

-e CONFIG_NET_ACT_POLICE \

-e CONFIG_NET_ACT_GACT \

-e CONFIG_DUMMY \

[BCC tool] critical

-e CONFIG_DEBUG_PREEMPT \

-e CONFIG_PREEMPTIRQ_EVENTS \

-d CONFIG_PROVE_LOCKING \

-d CONFIG_LOCKDEP

[bpftrace] Enable ftrace

-e CONFIG_FTRACE_SYSCALLS \

-e CONFIG_FUNCTION_TRACER \

-e CONFIG_HAVE_DYNAMIC_FTRACE \

-e CONFIG_DYNAMIC_FTRACE \

3.2构建自定义内核映像(GKI)

3.2.1、同步映像源文件

本次下载的内核源代码分支为:common-android-4.19-stable,如果您不熟悉如何构建 Android kernel,请先阅读官方的说明:

https://source.android.com/setup/build/building-kernels

3.2.2、扩展内核功能

修改配置文件common/build.config.gki_kprobes

修改配置文件common-modules/virtual-device/build.config.cuttlefish_kprobes.x86_64

ommon/Makefile文件头部

3.2.3 构建内核文件

构建通用内核和特定的供应商内核,该命令应在输出文件夹中生成和bzImageinitramfs.img,如下图:

3.3配置cuttlefish

使用我们之前构建的内核和初始化器启动一个 cuttlefish VM,命令如下:

3.4设置adeb & bcc

到现在为止,能够通过adb命令看到创建的cuttlefish设备。现在下载并安装 adeb,请注意,adeb 默认为生成arm64架构的设备,而我们的cuttlefish是x86_64架构的设备,因此我们必须指定使用如下命令安装x86_64架构的bcc程序。

完成后,尝试进入设备,测试安装的bcc工具,(下图将展示:利用sslsniff在无需安装安卓证书的情况下抓取HTTPS明文数据):




四、小结

尽管eBPF在Android系统下的应用场景还不是很成熟,严格受限于Kernel版本和Kernel的可扩展程度;随着Android 版本和Android Kernel的持续更新,新版Android系统必将会使用到更多的eBPF功能或特性,这也预示着eBPF日后将在Android中得到更广泛的应用,不仅仅局限于目前的安全和监测方面。


参考文章

[1] Android 通用内核

https://source.android.com/devices/architecture/kernel/android-common

[2] Cuttlefish 虚拟 Android 设备

https://source.android.com/setup/create/cuttlefish

[3] Installing BCC

https://github.com/iovisor/bcc/blob/master/INSTALL.md

[4]构建内核

https://source.android.com/setup/build/building-kernels

[5] Cuttlefish Getting Started

https://android.googlesource.com/device/google/cuttlefish/

[6] eBPF super powers on ARM64 and Android

http://www.joelfernandes.org/resources/bcc-ospm.pdf

[7] BCC (BPF compiler collection) for Android

https://github.com/joelagnel/adeb/blob/master/BCC.md

[8] BPF Features by Linux Kernel Version

https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md

[9] Introduction to virtio-networking and vhost-net

https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net

[10] Linux vsock internals

https://terenceli.github.io/%E6%8A%80%E6%9C%AF/2020/04/18/vsock-internals

[11] Kernel analysis using eBPF

https://elinux.org/images/d/dc/Kernel-Analysis-Using-eBPF-Daniel-Thompson-Linaro.pdf



精彩文章推荐


 关于 Android任意URL跳转的这些危害你知道吗?



浅析污点分析技术



什么是非导出组件的越权访问?开发者必看



什么是对抗样本攻击,这篇文章告诉你......

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存